/**
 * 格式化金额为货币形式
 * @param {number|string} value - 要格式化的金额
 * @param {Object} [options] - 格式化选项
 * @param {number} [options.decimalPlaces=2] - 小数位数
 * @param {string} [options.thousandsSeparator=','] - 千位分隔符
 * @param {string} [options.decimalSeparator='.'] - 小数点分隔符
 * @param {string} [options.currencyPrefix='￥'] - 货币前缀
 * @param {string} [options.currencySuffix=''] - 货币后缀
 * @param {boolean} [options.forceSign=false] - 是否强制显示正负号
 * @param {boolean} [options.removeTrailingZeros=false] - 是否移除末尾多余的0
 * @example
 * formatMoney(1234567.89); // ￥1,234,567.89
 * formatMoney(-1234567.89); // -￥1,234,567.89
 * formatMoney(1234567.89, { currencyPrefix: '$' }); // $1,234,567.89
 * formatMoney(1234567.89, { thousandsSeparator:'' }); // ￥1 234 567.89
 * formatMoney(1234567.89, { decimalPlaces: 3 }); // ￥1,234,567.890
 * formatMoney(1234567.8, { removeTrailingZeros: true }); // ￥1,234,567.8
 * formatMoney(1234567, { decimalPlaces: 0 }); // ￥1,234,567
 * @returns {string} 格式化后的金额字符串
 */
function formatMoney(value, options = {}) {
  // 合并默认选项
  const defaultOptions = {
    decimalPlaces: 2,
    thousandsSeparator: ",",
    decimalSeparator: ".",
    currencyPrefix: "￥",
    currencySuffix: "",
    forceSign: false,
    removeTrailingZeros: false,
  };
  const opts = { ...defaultOptions, ...options };

  // 处理非数字值
  if (value === null || value === undefined || value === "") {
    return (
      opts.currencyPrefix +
      "0" +
      opts.decimalSeparator +
      "00" +
      opts.currencySuffix
    );
  }

  // 转换为数字
  let number = parseFloat(value);
  if (isNaN(number)) {
    return (
      opts.currencyPrefix +
      "0" +
      opts.decimalSeparator +
      "00" +
      opts.currencySuffix
    );
  }

  // 处理符号
  const sign = number < 0 ? "-" : opts.forceSign ? "+" : "";
  number = Math.abs(number);

  // 格式化小数部分
  let [integer, decimal] = number.toFixed(opts.decimalPlaces).split(".");

  // 移除末尾多余的0（如果启用）
  if (opts.removeTrailingZeros && decimal) {
    decimal = decimal.replace(/0+$/, "");
    if (decimal === "") decimal = undefined;
  }

  // 添加千位分隔符
  if (opts.thousandsSeparator) {
    integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, opts.thousandsSeparator);
  }

  // 组合结果
  let result = sign + opts.currencyPrefix + integer;
  if (decimal !== undefined) {
    result += opts.decimalSeparator + decimal.padEnd(opts.decimalPlaces, "0");
  }
  result += opts.currencySuffix;

  return result;
}

/**
 * 将分转换为元，支持格式化显示
 * @param {number|string} fen - 金额（单位：分）
 * @param {Object} [options] - 格式化选项
 * @param {boolean} [options.fixed=true] - 是否固定两位小数
 * @param {boolean} [options.thousands=false] - 是否添加千位分隔符
 * @param {string} [options.prefix=''] - 金额前缀（如￥）
 * @param {string} [options.suffix=''] - 金额后缀（如元）
 * @example
 * fenToYuan(123456789); // ￥123,456,789.00
 * fenToYuan(123456789, { fixed: false }); // ￥123,456,789
 * fenToYuan(123456789, { thousands: true }); // ￥123,456,789.00
 * fenToYuan(123456789, { prefix: '$', suffix: '' }); // $123,456,789
 * fenToYuan(-123456789); // -￥123,456,789.00
 * @returns {string} 转换后的金额字符串
 */
function fenToYuan(fen, options = {}) {
  // 合并默认选项
  const defaultOptions = {
    fixed: true, // 默认保留两位小数
    thousands: false, // 默认不添加千位分隔符
    prefix: "", // 默认无前缀
    suffix: "", // 默认无后缀
  };
  const opts = { ...defaultOptions, ...options };

  // 处理非数字值
  if (fen === null || fen === undefined || fen === "") {
    return opts.prefix + "0.00" + opts.suffix;
  }

  // 转换为数字
  let amount = parseInt(fen, 10);
  if (isNaN(amount)) {
    return opts.prefix + "0.00" + opts.suffix;
  }

  // 计算元
  const isNegative = amount < 0;
  amount = Math.abs(amount);
  const yuan = Math.floor(amount / 100);
  const cents = amount % 100;

  // 格式化元部分
  let formattedYuan = yuan.toString();
  if (opts.thousands) {
    formattedYuan = formattedYuan.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  }

  // 格式化分部分
  let formattedCents = cents.toString();
  if (opts.fixed) {
    formattedCents = formattedCents.padStart(2, "0");
  }

  // 组合结果
  let result = isNegative ? "-" : "";
  result += opts.prefix;
  result += formattedYuan;
  if (opts.fixed || cents > 0) {
    result += "." + formattedCents;
  }
  result += opts.suffix;

  return result;
}

export { formatMoney, fenToYuan };
